<?php

namespace Agp\CoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use APY\DataGridBundle\Grid\Mapping as GRID;
use Doctrine\Common\Collections\ArrayCollection;
use Agp\CoreBundle\Entity\ListaPreco;

/**
 * Agp\CoreBundle\Entity\Ambiente
 *
 * @ORM\Table(name="ambiente")
 * @ORM\Entity()
 * 
 * @GRID\Source(groupBy="codAmbiente", columns="codAmbiente, descricao, setores.codListaPreco:count")
 * @ORM\HasLifecycleCallbacks
 */
class Ambiente
{
    /**
     * @var integer $codAmbiente
     *
     * @ORM\Column(name="cod_ambiente", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * 
     * @GRID\Column(title="Código", visible=false, type="text", size="5", primary=true)
     */
    protected $codAmbiente;
    
    /**
     * @var string $nome
     *
     * @ORM\Column(name="descricao", type="string", length=42, nullable=false)
     * @Assert\NotBlank()
     * 
     * @GRID\Column(title="Ambiente", type="text")
     */
    protected $descricao;
    
    /**
     * @var $ambiente
     *
     * @ORM\ManyToOne(targetEntity="Empresa", fetch="LAZY")
     * @ORM\JoinColumn(name="cod_empresa", referencedColumnName="cod_empresa")
     */
    protected $empresa;
    
    /**
     * @var $evento
     *
     * @ORM\ManyToOne(targetEntity="Evento", fetch="LAZY")
     * @ORM\JoinColumn(name="cod_evento", referencedColumnName="cod_evento", nullable=true)
     */
    protected $evento;
    
    /**
     *
     * @ORM\OneToMany(targetEntity="ListaPreco", mappedBy="ambiente", cascade={"all"}, orphanRemoval=true)
     * 
     * @GRID\Column(field="setores.codListaPreco:count", align="center", type="text", title="Quantidade de setores")
     * 
     * @Assert\Count(
     *      min = "1",
     *      minMessage = "Voce deve adicionar pelo menos um setor"
     * )
     * 
     */
    protected $setores;
    
    /**
     * 
     * @ORM\OneToMany(targetEntity="AmbienteProduto", mappedBy="ambiente", cascade={"all"}, orphanRemoval=true)
     * 
     * @Assert\Count(
     *      min = "1",
     *      minMessage = "Voce deve adicionar pelo menos um produto"
     * )
     */ 
    protected $produtos;
    
    /**
     * @var $qtdeNivel
     *
     * @ORM\Column(name="qtde_nivel", type="integer", nullable=false)
     * 
     * @Assert\NotBlank()
     * @Assert\Range( 
     *  min = 2,
     *  minMessage = "Deve possuir pelo menos dois níveis." 
     * )
     */
    protected $qtdeNivel;
    
    /* hack for Acls */
    public function getId(){
        return 'class';
    }

    public function __construct() {
        $this->setores = new ArrayCollection;
        $this->produtos = new ArrayCollection;
        $this->qtdeNivel = 2;
    }
   
    public function __toString() {
        return $this->descricao;
    }

    public function getCodAmbiente() {
        return $this->codAmbiente;
    }

    public function setCodAmbiente($codAmbiente) {
        $this->codAmbiente = $codAmbiente;
    }

    public function getEmpresa() {
        return $this->empresa;
    }

    public function setEmpresa($empresa) {
        $this->empresa = $empresa;
    }

    public function getDescricao() {
        return $this->descricao;
    }

    public function setDescricao($descricao) {
        $this->descricao = mb_strtoupper($descricao, 'UTF-8');
    }
    
    public function getSetores() {
        return $this->setores;
    }

    public function setSetores($setores) {
        $this->setores = $setores;
    }
    
    public function addSetor($setor) {
       
        $setor->setAmbiente($this);
        $setor->setEmpresa($this->empresa);
        $setor->setTipo(ListaPreco::TP_SETOR);
        $setor->setEvento($this->evento);
        $setor->setNivel($this->qtdeNivel);
        
        return $this->setores[] = $setor;
    }
    
    public function removeSetor($setor) {
        $this->setores->removeElement($setor);
    }
    
    public function getQtdeNivel() {
        return $this->qtdeNivel;
    }

    public function setQtdeNivel($qtdeNivel) {
        $this->qtdeNivel = $qtdeNivel;
    }
    
    public function getEvento() {
        return $this->evento;
    }

    public function setEvento($evento) {
        $this->evento = $evento;
    }
    
    public function getProdutos() {
        return $this->produtos;
    }

    public function setProdutos($produtos) {
        $this->produtos = $produtos;
    }
    
    public function addProduto($produto) {
       
        $produto->setAmbiente($this);
        return $this->produtos[] = $produto;
    }
    
    public function removeProduto($produto) {
        $this->produtos->removeElement($produto);
    }
    
    public function getProdutosToOptions(){
        $options = array();
        foreach ($this->produtos as $p){
            $options[$p->getCodAmbienteProduto()] = $p->getProduto()->getNome();
        }
        
        return $options;
    }
    
    public function isMeia($produto){
        
        if ($this->produtos->count() >= 2){
            if ($this->produtos->get(1)->getCodProduto() == $produto->getCodProduto())
                return true;
        }
        
        return false;
    }
}